package cn.lili.modules.goods_auth.serviceImpl;

import cn.lili.common.exception.ServiceException;
import cn.lili.modules.goods_auth.mapper.AuthSpaceGoodsMapper;
import cn.lili.modules.goods_auth.mapper.GoodsAuthSpaceMapper;
import cn.lili.modules.goods_auth.service.AuthSpaceGoodsService;
import cn.lili.modules.goods_auth.service.GoodsAuthSpaceService;
import cn.lili.modules.system.entity.dos.LiAuthSpace;
import cn.lili.modules.system.entity.dos.LiAuthSpaceGoods;
import cn.lili.modules.system.entity.dto.AuthSpaceSearchParams;
import com.baomidou.mybatisplus.core.conditions.query.LambdaQueryWrapper;
import com.baomidou.mybatisplus.core.conditions.query.QueryWrapper;
import com.baomidou.mybatisplus.core.conditions.update.UpdateWrapper;
import com.baomidou.mybatisplus.extension.plugins.pagination.Page;
import com.baomidou.mybatisplus.extension.service.impl.ServiceImpl;
import lombok.AllArgsConstructor;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.util.Assert;

import javax.annotation.Resource;

@Service
@AllArgsConstructor
@Slf4j
public class GoodsAuthSpaceServiceImpl extends ServiceImpl<GoodsAuthSpaceMapper, LiAuthSpace> implements GoodsAuthSpaceService {

    @Resource
    private AuthSpaceGoodsMapper authSpaceGoodsMapper;

    /**
     * 分页查询授权空间
     * @param searchParams 查询条件
     * @return 授权空间列表
     */
    @Override
    public Page<LiAuthSpace> spacePage(AuthSpaceSearchParams searchParams) {
        return this.page(new Page<>(searchParams.getPageNumber(), searchParams.getPageSize()), searchParams.queryWrapper());
    }

    /**
     * 添加授权空间
     * @param authSpace 授权空间
     * @return 是否成功
     */
    @Override
    public Boolean addSpace(LiAuthSpace authSpace) {
        Assert.notNull(authSpace.getName(),"空间名称不能为空");
        Assert.notNull(authSpace.getCode(),"空间编码不能为空");

        LiAuthSpace space = this.getOne(new LambdaQueryWrapper<LiAuthSpace>().eq(LiAuthSpace::getCode, authSpace.getCode()));
        Assert.isNull(space,"空间编号已存在");
        return this.save(authSpace);
    }

    /**
     * 删除空间
     *
     * @param id 空间ID
     * @return 是否成功
     * */
    @Override
    public Boolean deleteSpace(String id) {
        //如果该空间下还有商品，则不能删除该空间
        long count = authSpaceGoodsMapper.selectCount(new QueryWrapper<LiAuthSpaceGoods>().eq("auth_space_id", id));
        if (count>0){
            throw new ServiceException("该空间下存在商品无法删除");
        }
        return this.removeById(id);
    }

    /**
     * 更新空间
     *
     * @param authSpace 空间内容
     * @return 是否成功
     * */
    @Override
    public Boolean updateSpace(LiAuthSpace authSpace) {
        UpdateWrapper<LiAuthSpace>wrapper=new UpdateWrapper<LiAuthSpace>().eq("id",authSpace.getId())
                .set("name",authSpace.getName());
        return this.update(wrapper);
    }

    /**
     * 根据名称匹配空间
     * @param name
     * @return
     */
    @Override
    public LiAuthSpace getByName (String name) {
        LambdaQueryWrapper<LiAuthSpace> queryWrapper = new LambdaQueryWrapper<>();
        queryWrapper.likeRight(LiAuthSpace::getCode, name);
        queryWrapper.last("limit 1");
        return this.getOne(queryWrapper);
    }
}
